%matplotlib qt
import numpy as np
import matplotlib.pyplot as plt
# za animiran izris
from IPython.display import HTML
from matplotlib import animation
# parametri funkcije
Fvz = 20 # frekvenca vzorčenja (v Hz)
Fvz_cont = Fvz*100 # frekvenca vzorčenja za signal, ki je simulacija zveznega signala
T = 1 # dolžina signala v sekundah
t = np.arange(0, T * Fvz, 1) / Fvz # vektor časovnih indeksov
t_cont = np.arange(0, T*Fvz_cont, 1)/Fvz_cont
f = 3 # frekvenca sinusoide
A = 1 # amplituda sinusoide
faza = 0.0 # faza sinusoide
# izracun/generiranje signalov
# to je vzorčen signal
s = A * np.sin(2 * np.pi * f * t + faza * np.pi)
# to je tudi vzorčen signal, ampak pri precej višji vzorčevalni frekvenci,
# zato služi kot približek zveznega signala
s_cont = A * np.sin(2 * np.pi * f * t_cont + faza * np.pi)
# pripravi graf za risanje
fig, ax = plt.subplots()
ax.set_xlim((0, 1))
ax.set_ylim((-1, 1))
ax.set_ylabel('amplituda')
ax.set_xlabel('čas (s)')
# izris za zvezni signal
l_cont, = ax.plot(t_cont, s_cont, linewidth=2.0, color='gray', label='zvezni signal')
# izris za vzorcen signal
l_samp = ax.stem(t, s, linefmt='r', markerfmt='r', label='vzorčen signal')
plt.legend(loc='upper right')
# funkcija za izračun posamezne slike animacije
def animate(faza):
# ponovno izracunamo oba signala pri drugi fazi
s = A * np.sin(2 * np.pi * f * t + faza * np.pi)
s_cont = A * np.sin(2 * np.pi * f * t_cont + faza * np.pi)
# posodobimo podatke izrisa zveznega signala
l_cont.set_data(t_cont, s_cont)
# posodobimo podatke izrisa vzorcenega signala
l_samp[0].set_data(t, s)
line_segs = l_samp[1].get_segments()
for line_seg, v in zip(line_segs, s):
line_seg[1, 1] = v
l_samp[1].set_segments(line_segs)
ax.set_title('Fvz = %d Hz, Frekvenca = %.2f Hz, faza = %.2f' % (Fvz, f, faza))
return l_samp + (l_cont,)
# matplotlib animator (graf, funkcija za izračun/izris, začetni izris,
# poslana spremenljivka za posamezen izračun/izris, čas med izrisom(ms), izriši samo spremenjene dele)
ani = animation.FuncAnimation(fig, animate,
frames=np.arange(0, 6, 0.05), interval=50, blit=False, repeat=False)
# prikaži animiran izris
HTML(ani.to_jshtml())
# parametri funkcije
Fvz = 20 # frekvenca vzorčenja (v Hz)
Fvz_cont = Fvz*100 # frekvenca vzorčenja za signal, ki je simulacija zveznega signala
T = 1 # dolžina signala v sekundah
t = np.arange(0, T * Fvz, 1) / Fvz # vektor časovnih indeksov
t_cont = np.arange(0, T*Fvz_cont, 1)/Fvz_cont
f = 0 # frekvenca sinusoide
A = 1 # amplituda sinusoide
faza = 0 # faza sinusoide
# to je vzorčen signal
s = A * np.sin(2 * np.pi * f * t + faza * np.pi)
# to je tudi vzorčen signal, ampak pri precej višji vzorčevalni frekvenci,
# zato služi kot približek zveznega signala
s_cont = A * np.sin(2 * np.pi * f * t_cont + faza * np.pi)
# pripravi graf za risanje
fig, ax = plt.subplots()
ax.set_xlim((0, 1))
ax.set_ylim((-1, 1))
ax.set_ylabel('amplituda')
ax.set_xlabel('čas (s)')
# izris za zvezni signal
l_cont, = ax.plot(t_cont, s_cont, linewidth=2.0, color='gray', label='zvezni signal')
# izris za vzorcen signal
l_samp = ax.stem(t, s, linefmt='r', markerfmt='r', label='vzorčen signal')
plt.legend(loc='upper right')
# funkcija za izris posamezne slike animacije
def animate(f):
# to je vzorčen signal
s = A * np.sin(2 * np.pi * f * t + faza * np.pi)
# to je tudi vzorčen signal, ampak pri precej višji vzorčevalni frekvenci,
# zato služi kot približek zveznega signala
s_cont = A * np.sin(2 * np.pi * f * t_cont + faza * np.pi)
# posodobimo podatke izrisa zveznega signala
l_cont.set_data(t_cont, s_cont)
# posodobimo podatke izrisa vzorcenega signala
l_samp[0].set_data(t, s)
line_segs = l_samp[1].get_segments()
for line_seg, v in zip(line_segs, s):
line_seg[1, 1] = v
l_samp[1].set_segments(line_segs)
ax.set_title('Fvz = %d Hz, Frekvenca = %.2f Hz, faza = %.2f' % (Fvz, f, faza))
return l_samp + (l_cont,)
# matplotlib animator (graf, funkcija za izračun/izris, začetni izris,
# poslana spremenljivka za posamezen izračun/izris, čas med izrisom(ms), izriši samo spremenjene dele)
ani = animation.FuncAnimation(fig, animate,
frames=np.arange(0, 2 * Fvz, 0.25), interval=50, blit=False, repeat=False)
# prikaži animiran izris
HTML(ani.to_jshtml())